package storage;

/*
 * 内存管理
 * @time	2014-10-02
 * 
 */
public class Index {

	private static int[] rams;
	private static storage.Pcb[] pcbs;
	private static RamTable ramTable;//内存分配表
	private static int tempProcId;
	
	static{
		//初始化静态变量
		pcbs=new storage.Pcb[1000];
		rams=new int[128];
		ramTable=new RamTable();
		tempProcId=1;
		
		for(int i=0;i<pcbs.length;i++){
			pcbs[i]=new Pcb();
		}
		
		for(int i=0;i<rams.length;i++){
			rams[i]=0;
		}
		
	}
	
	/*
	 * 创建进程
	 * @param	size	内存大小
	 * @param	level	优先级
	 * @param	needTime	程序运行所需时间
	 * @param	devNums	所需设备数组
	 * @return 
	 */
	public java.util.Map<String,Object> createProc(int size,int level,int needTime,int[] devNums){
		
		java.util.Map<String,Object> map=new java.util.TreeMap<String,Object>();
		
		if(devNums[0]<=1&&devNums[1]<=2&&devNums[2]<=2){
			boolean result=ramTable.apply(tempProcId, size);
			map.put("result",result);
		}else{
			map.put("result",false);
		}
		if((Boolean)map.get("result")){//申请内存成功
			map.put("procId",tempProcId);
			tempProcId++;
			for(int i=0;i<pcbs.length;i++){//遍历pcb队列
				if(pcbs[i].getStatus()==null){
					pcbs[i].setPid((Integer)map.get("procId"));
					pcbs[i].setRam(size);
					pcbs[i].setLevel(level);
					pcbs[i].setStatus("就绪态");
					pcbs[i].setNeedTime(needTime);
					pcbs[i].setDevANumber(devNums[0]);
					pcbs[i].setDevBNumber(devNums[1]);
					pcbs[i].setDevCNumber(devNums[2]);
					pcbs[i].setRunTime(0);
					break;
				}
			}
		}else{//申请内存失败
			//不处理
		}
		
		return map;
	}
	
	/*
	 * 结束进程
	 * @param	procId	进程id
	 */
	public boolean destroyProc(int procId){
		freeDev(procId);//释放设备
		ramTable.free(procId);
		for(int i=0;i<pcbs.length;i++){
			if(pcbs[i].getPid()==procId){//找到该进程
				pcbs[i].setStatus("结束态");
			}
		}
		return true;
	}
	
	/*
	 * 阻塞进程
	 * @param	procId	进程id
	 */
	public boolean blockProc(int procId){
		for(int i=0;i<pcbs.length;i++){
			if(pcbs[i].getPid()==procId){//找到该进程
				pcbs[i].setStatus("阻塞态");
			}
		}
		return true;
	}
	
	/*
	 * 唤醒进程
	 * @param	procId	进程id
	 */
	public boolean awakeProc(int procId){
		for(int i=0;i<pcbs.length;i++){
			if(pcbs[i].getPid()==procId){//找到该进程
				pcbs[i].setStatus("就绪态");
			}
		}
		return true;
	}
	
	/*
	 * 申请设备
	 * @param	procId	进程id
	 * @param	devType	要申请的设备类型
	 * @param	devNumber	要申请的设备数量
	 */
	public boolean applyDev(int procId,int devANumber,int devBNumber,int devCNumber){
		boolean result= controller.Dev.getObject().apply(procId, devANumber, devBNumber, devCNumber);
		if(result){//申请设备成功,记录进PCB
			
			for(int i=0;i<pcbs.length;i++){
				if(pcbs[i].getPid()==procId){
					pcbs[i].setDevANumber(devANumber);
					pcbs[i].setDevBNumber(devBNumber);
					pcbs[i].setDevCNumber(devCNumber);
				}
			}
			
		}
		
		return result;
	}
	
	/*
	 * 释放设备，在结束进程时调用
	 * @param	procId	进程id
	 */
	private boolean freeDev(int procId){
		return controller.Dev.getObject().free(procId);
	}
	
	/*
	 * 获取PCB
	 * 
	 */
	public Pcb[] getPcbs(){
		return pcbs;
	}
	
}
